package com.demo.lambda;

import org.junit.Test;

import java.util.Comparator;

/**
 * 变量作用域 02
 * 1.我们也可以直接在 lambda 表达式中访问外层的局部变量
 * 2.lambda 表达式的局部变量可以不用声明为 final，但是必须不可被后面的代码修改（即隐性的具有 final 的语义）
 * 3.在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
 * @author gy
 * @date 2022/5/9
 */
public class Java8LambdaVariable02 {
    public static void main(String[] args) {
        // 1.我们也可以直接在 lambda 表达式中访问外层的局部变量
        final int num = 1;
        Converter<Integer, String> s = (param) -> System.out.println((param + num));
        s.convert(2);  // 输出结果为 3
    }


    /**
     * 2.lambda 表达式的局部变量可以不用声明为 final，但是必须不可被后面的代码修改（即隐性的具有 final 的语义）
     */
    @Test
    public void m1(){
//        int num = 1;
//        Converter<Integer, String> s = (param) -> System.out.println(String.valueOf(param + num));
//        s.convert(2);
//        num = 5;
//报错信息：Local variable num defined in an enclosing scope must be final or effectively
    }

    /**
     * 3. 在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。
     */
    @Test
    public void m2(){
        String first = "";
//        Comparator<String> comparator = (first, second) ->
//                Integer.compare(first.length(), second.length());  //编译会出错
    }

    public interface Converter<T1, T2> {
        void convert(int i);
    }


}
